package com.lifeng.patterns.spring;

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.stereotype.Component;

import java.util.HashMap;
import java.util.Map;

/**
 * Created by lifeng on 2019/5/23.
 * 1、BeanFactoryPostProcessor的执行优先级高于BeanPostProcessor
 * 2、BeanFactoryPostProcessor的postProcessBeanFactory()方法只会执行一次
 *
 * 可以在spring的bean创建之前，修改bean的定义属性。
 * 也就是说，Spring允许BeanFactoryPostProcessor在容器实例化任何其它bean之前读取配置元数据，
 * 并可以根据需要进行修改，例如可以把bean的scope从singleton改为prototype，也可以把property的值给修改掉。
 * 可以同时配置多个BeanFactoryPostProcessor，并通过设置'order'属性来控制各个BeanFactoryPostProcessor的执行次序。
 */
@Component
public class MyBeanFactoryPostProcessor implements BeanFactoryPostProcessor{
    @Override
    public void postProcessBeanFactory(ConfigurableListableBeanFactory configurableListableBeanFactory) throws BeansException {
        System.out.println("执行postProcessBeanFactory");
        //BeanDefinition bd = configurableListableBeanFactory.getBeanDefinition("sysUser");
        //bd.setAttribute("id","123");

        //Map<String,Object> myMap = new HashMap<String,Object>();
        //configurableListableBeanFactory.registerSingleton("myMap",myMap);
    }
}
